package com.br.negocio.web.backbean;

import java.io.Serializable;

import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.hibernate.exception.ConstraintViolationException;
import org.springframework.context.annotation.Scope;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Controller;

import com.br.negocio.controller.ControllerFormaPagamento;
import com.br.negocio.vo.FormaPagamentoVO;
import com.br.negocio.web.formbean.FormaPagamentoFormBean;

@Controller("formaPagamentoBackBean")
@Scope("session")
public class FormaPagamentoBackBean implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Resource
	private ControllerFormaPagamento controllerFormaPagamento;
	
	private FormaPagamentoFormBean formaPagamentoFormBean;

	public FormaPagamentoBackBean() {
		super();
		this.formaPagamentoFormBean = new FormaPagamentoFormBean();
	}

	public FormaPagamentoFormBean getFormaPagamentoFormBean() {
		return this.formaPagamentoFormBean;
	}

	public void setFormaPagamentoFormBean(FormaPagamentoFormBean formaPagamentoFormBean) {
		this.formaPagamentoFormBean = formaPagamentoFormBean;
	}
	
	// M�TODOS

	public void obterListaFormaPagamento() {
		FacesContext context = FacesContext.getCurrentInstance();
		
		try {
			this.formaPagamentoFormBean.setListaFormaPagamento(this.controllerFormaPagamento.obterListaFormaPagamento());
		} catch (Exception e) {
			context.addMessage(null, new FacesMessage("Erro ao obter a lista de formas de pagamento: " + e.getMessage()));
		}
	}
	
	public void manterFormaPagamento() {
		FacesContext context = FacesContext.getCurrentInstance();
		
		try {
			if (this.formaPagamentoFormBean.getFormaPagamentoManter().getCodigo() == 0) {
				this.controllerFormaPagamento.inserirFormaPagamento(this.formaPagamentoFormBean.getFormaPagamentoManter());
			} else {
				this.controllerFormaPagamento.atualizarFormaPagamento(this.formaPagamentoFormBean.getFormaPagamentoManter());
			}
			this.formaPagamentoFormBean.setListaFormaPagamento(this.controllerFormaPagamento.obterListaFormaPagamento());
		} catch (Exception e) {
			context.addMessage(null, new FacesMessage("Erro ao manter a forma de pagamento: " + e.getMessage()));
		}

	}
	
	public void excluirFormaPagamento() {
		FacesContext context = FacesContext.getCurrentInstance();
		
		try {
			if (this.getFormaPagamentoFormBean().getFormaPagamentoManter().getCodigo() != 0) {
				this.controllerFormaPagamento.removerFormaPagamento(this.formaPagamentoFormBean.getFormaPagamentoManter());
				this.formaPagamentoFormBean.setListaFormaPagamento(this.controllerFormaPagamento.obterListaFormaPagamento());
				this.formaPagamentoFormBean.setFormaPagamentoManter(new FormaPagamentoVO());
			}
		} catch (DataIntegrityViolationException e) {
			if (e.getCause().getClass() == ConstraintViolationException.class) {
				context.addMessage(null, new FacesMessage("Erro ao excluir a forma de pagamento: A forma de pagamento est� associada a alguma outra entidade."));
			} else {
				context.addMessage(null, new FacesMessage("Erro ao excluir a forma de pagamento: " + e.getMessage()));
			}
		} catch (Exception e) {
			context.addMessage(null, new FacesMessage("Erro ao excluir a forma de pagamento: " + e.getMessage()));
		}
	}
	
	// LISTENERS
	
	public void listenerIrInserirFormaPagamento(ActionEvent evento) {
		this.formaPagamentoFormBean.setFormaPagamentoManter(new FormaPagamentoVO());
		this.formaPagamentoFormBean.setIsDisabled(false);
		this.formaPagamentoFormBean.setHead("Cadastrar Cadastrar");
	}
	
	public void listenerIrExcluirFormaPagamento(ActionEvent evento) {
		UIParameter comp = (UIParameter) evento.getComponent().findComponent("formaPagamentoExcluir");
		FormaPagamentoVO formaPagamentoVO = ((FormaPagamentoVO)comp.getValue());
		
		if (formaPagamentoVO != null) {
			this.formaPagamentoFormBean.setFormaPagamentoManter(this.controllerFormaPagamento.obterFormaPagamento(formaPagamentoVO));
		}
		this.formaPagamentoFormBean.setHead("Excluir Cadastrar");
		this.formaPagamentoFormBean.setIsDisabled(true);
	}
	
	public void listenerIrEditarFormaPagamento(ActionEvent evento) {
		UIParameter comp = (UIParameter) evento.getComponent().findComponent("formaPagamentoEditar");
		FormaPagamentoVO formaPagamentoVO = ((FormaPagamentoVO)comp.getValue());
		
		if (formaPagamentoVO != null) {
			this.formaPagamentoFormBean.setFormaPagamentoManter(this.controllerFormaPagamento.obterFormaPagamento(formaPagamentoVO));
		}
		this.formaPagamentoFormBean.setHead("Editar Cadastrar");
		this.formaPagamentoFormBean.setIsDisabled(false);
	}

}